import moment from 'moment-mini';

export { moment };

export interface CalcDateInterface {
  year: any;
  month: any;
  day: any;

  toString(): string;
}

export class DateHelper {
  /**
   * 计算日期天数差
   * @param {string} birthday
   * @param {string} today
   * @returns {number}
   * @constructor
   */
  static GetSumDay(birthday: string, today: string): number {
    let d1 = moment(birthday);
    let d2 = moment(today);
    if (d1.diff(d2) > 0) {
      const t = d1;
      d1 = d2;
      d2 = t;
    }
    return d2.diff(d1, 'd');
  }

  /**
   * 获取月份(月龄)总数
   * @param {string} birthday
   * @param {string} today
   * @returns {number}
   * @constructor
   */
  static GetSumMonth(birthday: string, today: string): number {
    let d1 = moment(birthday);
    let d2 = moment(today);
    if (d1.diff(d2) > 0) {
      const t = d1;
      d1 = d2;
      d2 = t;
    }
    let sumMonths = (d2.year() - d1.year()) * 12 + (d2.month() + 1) - (d1.month() + 1); // 总月数=相差年份*12+结束月数-开始月数
    if (d2.date() - d1.date() < 0) {
      // 结束日期 日 比 开始日期 日 小；需要借月份
      // 判断是否为月份最后一天，如果为月份最后一天，相当于此月份已过去，等效于1～12月的最后一天，最后一天必然比当月的任何一天大
      // 比如2016-3-31出生，2016-4-30体检，sumMonths结果为1，此已经为正确结果
      if (d2.clone().add(1, 'd').month() === d2.month()) {
        // 不是最后一天
        sumMonths--;
      }
    }
    return sumMonths;
  }

  /**
   * 获取用户年龄对象
   * @param birthday
   * @param today
   */
  static CalcDate(birthday: string, today: string): CalcDateInterface {
    let d1 = moment(birthday);
    let d2 = moment(today);
    let preString = '';
    if (isNaN(d1 as any) || isNaN(d2 as any)) {
      return {
        year: 0,
        month: 0,
        day: 0,
        toString() {
          return '';
        }
      };
    }
    if (d1.diff(d2) > 0) {
      const t = d1;
      d1 = d2;
      d2 = t;
      preString = '-';
    }
    const sumMonths = DateHelper.GetSumMonth(birthday, today);
    const year = parseInt((sumMonths / 12) as any);
    const month = sumMonths % 12;
    let day = d2.date() - d1.date();

    if (day < 0) {
      const currentYearDate = d1.clone().add(year, 'y').add(month, 'M');
      day = d2.diff(currentYearDate, 'days');
    }
    return {
      year,
      month,
      day,
      toString() {
        // 检测是否符合矫正胎龄的情况
        if (preString) {
          const days = Math.abs(DateHelper.GetSumDay(birthday, today));
          if (days <= 100) {
            const weeks = Math.floor((40 * 7 - days) / 7);
            const day = Math.floor((40 * 7 - days) % 7);
            return `胎龄${weeks}周${day ? `${day}天` : ''}`;
          }
        }

        let result = '';
        if (this.year) {
          result += `${this.year}岁`;
        }
        if (this.month) {
          result += `${this.month}月`;
        }
        if (this.day) {
          result += `${this.day}天`;
        }
        return preString + (result || '0天');
      }
    };
  }

  /**
   * 返回实足月龄
   * @param {string} birthday
   * @param {string} today
   * @return {number};
   */
  static GetSzMonth(birthday: string, today: string): number {
    const d1 = moment(birthday);
    const d2 = moment(today);
    if (d1.isValid() && d2.isValid()) {
      // if (d1.diff(d2) > 0) {
      //     let t = d1;
      //     d1 = d2;
      //     d2 = t;
      // }
      // let sumMonths = (d2.year() - d1.year()) * 12 + (d2.month() + 1) - (d1.month() + 1);
      // // 开始月天数
      // let d1Days = d1.daysInMonth();
      // // 开始月可经理的天数
      // let d1LastDays = (d1Days + 1) - d1.date();
      // // 当前月天数
      // let d2Days = d2.daysInMonth();
      // // 当前月已经过去的天数
      // let d2HasDays = d2.date();
      // // 月份减一 加上 开始月和结束月拥有的月份比例
      // let monthAge = sumMonths - 1 + (d1LastDays / d1Days) + (d2HasDays / d2Days);

      // 使用 moment 内置的方法计算实足月龄
      const monthAge = Math.abs(d1.diff(d2, 'months', true));
      return Math.round(monthAge * 10) / 10;
    }

    // 无效日期直接返回 0;
    return 0;
  }

  /**
   * 返回实足月龄 按每月30天算
   * @param {string} birthday
   * @param {string} today
   * @return {number};
   * @TODO 待测试 先写思路
   */
  static GetSzMonthByThirtyDay(birthday: string, today: string): number {
    let d1 = moment(birthday);
    let d2 = moment(today);
    if (d1.isValid() && d2.isValid()) {
      if (d1.diff(d2) > 0) {
        const t = d1;
        d1 = d2;
        d2 = t;
      }
      let wholeMonthDiff = (d2.year() - d1.year()) * 12 + (d2.month() - d1.month());
      let adjust;
      if (d1.clone().add(wholeMonthDiff, 'months').isAfter(d2)) {
        wholeMonthDiff--;
        adjust = d1.clone().add(wholeMonthDiff, 'months').diff(d2, 'days') / 30;
      } else {
        adjust = d1.clone().add(wholeMonthDiff, 'months').diff(d2, 'days') / 30;
      }
      return wholeMonthDiff + Math.abs(adjust) || 0;
    }
    // 无效日期直接返回 0;
    return 0;
  }
}
